﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Exchange;
using Strategy.Linkage;
using DataSource;


namespace Trader
{
    
    public class TradeManager
    {
        Position pos;
        OrderRecord odr;
        DateTime curTime;
        public delegate void OrderSendEventHandler(Order od);
        public event OrderSendEventHandler OnOrderSendEvent;  // 提供给交易所注册,响应订单发送信号
        public TradeManager()
        {
            pos = new Position();
            odr = new OrderRecord();
        }

        public void SendOrder(Order od)
        {
            OnOrderSendEvent(od); // 提供给交易所去响应
        }

        public void Buy(Follow fl)
        {
            //if(pos.IsPosition(fl.code)) //如果账户有该票持仓，就不要买入
            //{
            //    return;
            //}
            if (!odr.IsOrderComplete(fl.code)) //如果该票,有已发送未收的单（交易所没有反馈的订单），也不要买入
            {
                return;
            }
            if (odr.IsAnyOrderBelongTheSameLeader(fl)) //跟随同一个leader（代码一样，成为leader时间一样），不同时间follow的相同股票，是否在已发的订单中
            {
                return;
            }
            Order od = odr.BuildBuyOrder(fl, 1, 100); // 构造订单，并在订单记录中保存该订单
            SendOrder(od);
        }

        public void OnDealReceived(Deal dl) //收到反馈信息，更新本地订单管理系统，订阅交易所的OnDealSendEvent
        {
            odr.Update(dl);
            pos.Update(dl);
        }

        public void OnTimePulse(DateTime dt)
        {
            curTime = dt;
            odr.OnTimePulse(dt);
        }

        public DateTime GetCurrentTime()
        {
            return curTime;
        }

        public void Sell(Follow fl)
        {
            Record rd = odr.GetCounterpartOrder(fl);
            if (rd != null)
            {
                Order od;
                if(rd.state == OrderState.Fill)
                {
                    od = odr.BuildSellOrder(fl, 1, rd.quoteVolume);
                    SendOrder(od);
                }
                else if(rd.state == OrderState.PartFill)
                {
                    Order odCancel = odr.BuildCancelOrder(fl, rd.orderId);
                    SendOrder(odCancel); //先撤销还在交易所挂着的订单
                    od = odr.BuildSellOrder(fl, 1, rd.dealVolume);
                    SendOrder(od); //把已成交的卖掉
                }
                else if(rd.state == OrderState.NotFill) //只需要撤销挂单，没有可卖出的量
                {
                    Order odCancel = odr.BuildCancelOrder(fl, rd.orderId);
                    SendOrder(odCancel); //先撤销还在交易所挂着的订单
                }
                else if(rd.state == OrderState.Send) //只需要撤销挂单，没有可卖出的量
                {
                    Order odCancel = odr.BuildCancelOrder(fl, rd.orderId);
                    SendOrder(odCancel); //先撤销还在交易所挂着的订单
                }

            }
        }


        public void Cancel() //可能用于收到deal回馈，发现还有挂单,就撤销该订单
        {

        }

        public void Save(string path)
        {
            odr.Save(path);
        }
    }
}
